from fastapi import Request

from models.blog import BlogVisit

# 博客概要字数
BLOG_SUMMARY_COUNT = 100

# 阅读速度 600 字/分钟
READ_SPEED = 600.0

# 博客非统计字符
EXCLUDE_CHARS = [' ', '\n', '\t']


def get_word_count(text: str) -> int:
    """
    获取文本字数

    :param text: 文本
    :return: 字数
    """
    count = 0

    if not text:  # 检查None或空字符串
        return count

    for char in text:
        if char not in EXCLUDE_CHARS:
            count += 1

    return count


def get_read_duration(word_count: int) -> float:
    """
    获取阅读时长 单位：分钟

    :param word_count: 文本字数
    :return: 阅读时长
    """
    return word_count / READ_SPEED


def get_blog_summary(content: str) -> str:
    """
    获取简要信息

    :param content: 博客内容
    :return: 简要信息
    """
    if len(content) > BLOG_SUMMARY_COUNT:
        return content[:BLOG_SUMMARY_COUNT]
    return content


def get_client_ip(request):
    """从请求中获取客户端IP地址"""
    x_forwarded_for = request.headers.get("X-Forwarded-For")
    if x_forwarded_for:
        return x_forwarded_for.split(',')[0]
    return request.client.host


def get_user_agent_info(user_agent: str):
    """解析User-Agent获取操作系统和浏览器信息"""
    # 使用正则表达式进行更精确的解析
    os = "Unknown"
    browser = "Unknown"

    # 操作系统检测
    if "Windows NT" in user_agent:
        os = "Windows"
    elif "Macintosh" in user_agent:
        os = "Mac OS"
    elif "Linux" in user_agent:
        os = "Linux"
    elif "Android" in user_agent:
        os = "Android"
    elif "iPhone" in user_agent or "iPad" in user_agent:
        os = "iOS"

    # 浏览器检测
    if "Chrome" in user_agent:
        browser = "Chrome"
    elif "Firefox" in user_agent:
        browser = "Firefox"
    elif "Safari" in user_agent and "Chrome" not in user_agent:
        browser = "Safari"
    elif "Edge" in user_agent:
        browser = "Edge"
    elif "MSIE" in user_agent or "Trident" in user_agent:
        browser = "Internet Explorer"

    return os, browser


def get_blog_visit(request: Request, blog_id: int) -> BlogVisit:
    ip = get_client_ip(request)
    user_agent = request.headers.get("User-Agent", "")
    os, browser = get_user_agent_info(user_agent)

    return BlogVisit(
        ip=ip,
        os=os,
        browser=browser,
        uri=request.url.path,
        blog_id=blog_id
    )
